﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSNN
{
    /// <summary>
    /// Класс нейрона
    /// </summary>
    public class Neuron
    {
        /// <summary>
        /// Количество синапсов нейрона
        /// </summary>
        public int SynapseCount { get; private set; }

        /// <summary>
        /// Весовые коэффициэнты
        /// </summary>
        public double []Synapses;

        public Neuron(int SynapseCount)
        {
            this.SynapseCount = SynapseCount;
            this.Synapses = new double[SynapseCount + 1];
        }     
        
        /// <summary>
        /// Подача образа на нейрон
        /// </summary>
        /// <param name="ImageForNeuron">Образ, подающийся на нейрон</param>
        /// <returns>Выходной сигнал нейрона</returns>        
        public double GetOutSignal(Image ImageForNeuron)
        {
            if (this.Synapses == null)
            {
                throw new ArgumentNullException("Ошибка! Образ не определен.");
            }

            if (ImageForNeuron.InputSignals.Length != this.SynapseCount)
            {
                throw new ArgumentException("Ошибка! Не соответсвующая размерность образа к данному нейрону.");
            }
            
            double NeuronSum = 0;

            for (int i = 0; i < this.SynapseCount; i++)
            {
                NeuronSum += this.Synapses[i] * ImageForNeuron.InputSignals[i];
            }

            NeuronSum += this.Synapses[this.SynapseCount] * 1;

            double NeuronOut = (1 / (1 + Math.Exp(-NeuronSum)));

            return NeuronOut;         
        }

        /// <summary>
        /// Изменение весового коэффициэнта
        /// </summary>
        /// <param name="SynapseNumber">Порядковый номер синапса нейрона</param>
        /// <param name="NewWeightValue">Новое значение синапса</param>        
        public void WeightCorrection(int SynapseNumber, double NewWeightValue)
        {
            this.Synapses[SynapseNumber] = NewWeightValue;
        }

        /// <summary>
        /// Установка весов нейронов в нуль
        /// </summary>
        public void SetNullWeight()
        {
            for (int i = 0; i < this.SynapseCount; i++)
            {
                this.Synapses[i] = 0;
            }
        }

    }
}
